package org.jsola.hr.web;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.jsola.core.Page;
import org.jsola.core.Result;
import org.jsola.hr.constant.CustomerModuleType;
import org.jsola.hr.dto.CustomDTO;
import org.jsola.hr.dto.CustomTemplateAddDTO;
import org.jsola.hr.dto.CustomTemplateUpdateDTO;
import org.jsola.hr.query.CustomTemplateQuery;
import org.jsola.hr.vo.CustomFieldValueVO;
import org.jsola.hr.vo.CustomTemplateListVO;
import org.jsola.hr.vo.CustomTemplateVO;

import java.util.List;

/**
 * 自定义模板
 *
 * @author zhr
 */
@Api(tags = "hr-自定义模板")
public interface ICustomTemplateControllerAPI {

    /**
     * 新增自定义模板
     *
     * @param customTemplateAddDTO 自定义模板新增实体
     * @return 自定义模板展示对象
     */
    @ApiOperation(value = "新增自定义模板")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customTemplateAddDTO", dataType = "CustomTemplateAddDTO", value = "新增自定义模板", paramType = "body")
    })
    Result<CustomTemplateVO> save(CustomTemplateAddDTO customTemplateAddDTO);

    /**
     * 新建模板
     *
     * @param customTemplateAddDTO 自定义模板新增实体
     * @return 自定义模板展示对象
     */
    @ApiOperation(value = "新建模板")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customTemplateAddDTO", dataType = "CustomTemplateAddDTO", value = "新增自定义模板", paramType = "body")
    })
    Result<CustomTemplateVO> saveTemplate(CustomTemplateAddDTO customTemplateAddDTO);


    /**
     * 修改自定义模板
     *
     * @param customTemplateUpdateDTO 自定义模板
     * @return 更新数量
     */
    @ApiOperation(value = "修改自定义模板")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customTemplateUpdateDTO", dataType = "CustomTemplateUpdateDTO", value = "修改自定义模板", paramType = "body")
    })
    Result<Integer> update(CustomTemplateUpdateDTO customTemplateUpdateDTO);

    /**
     * 修改自定义模板 1、租户级选择自定义，所有用工单位花名册新增自定义字段 2、模板可选字段取用花名册 不需要再往花名册同步
     *
     * @param customTemplateUpdateDTO 自定义模板
     * @return 更新数量
     */
    @ApiOperation(value = "修改自定义模板")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customTemplateUpdateDTO", dataType = "CustomTemplateUpdateDTO", value = "修改自定义模板", paramType = "body")
    })
    Result<Integer> update2(CustomTemplateUpdateDTO customTemplateUpdateDTO);


    /**
     * 删除单个自定义模板，彻底删除
     *
     * @param customTemplateId 自定义模板id
     * @return 删除数量
     */
    @ApiOperation(value = "删除单个自定义模板，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customTemplateId", dataType = "String", value = "自定义模板id", paramType = "path")
    })
    Result<Integer> delete(String customTemplateId);


    /**
     * 批量删除自定义模板，彻底删除
     *
     * @param customTemplateIds 自定义模板id集合
     * @return 删除数量
     */
    @ApiOperation(value = "批量删除自定义模板，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customTemplateIds", dataType = "String[]", value = "自定义模板id数组", paramType = "body", allowMultiple = true)
    })
    Result<Integer> deleteBatch(String[] customTemplateIds);


    /**
     * 根据自定义模板id查询自定义模板详情
     *
     * @param customTemplateId 自定义模板id
     * @return 自定义模板详情
     */
    @ApiOperation(value = "根据自定义模板id查询自定义模板详情")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customTemplateId", dataType = "String", value = "自定义模板id", paramType = "path")
    })
    Result<CustomTemplateVO> findById(String customTemplateId);


    /**
     * 查询自定义模板
     *
     * @param customTemplateQuery 自定义模板查询参数
     * @return page
     */
    @ApiOperation(value = "查询自定义模板")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customTemplateQuery", dataType = "CustomTemplateQuery", value = "自定义模板查询参数", paramType = "query")
    })
    Result<List<CustomTemplateListVO>> listAll(CustomTemplateQuery customTemplateQuery);


    /**
     * 分页查询自定义模板
     *
     * @param customTemplateQuery 自定义模板查询参数
     * @return page
     */
    @ApiOperation(value = "分页查询自定义模板")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customTemplateQuery", dataType = "CustomTemplateQuery", value = "自定义模板查询参数", paramType = "query")
    })
    Result<Page<CustomTemplateListVO>> page(CustomTemplateQuery customTemplateQuery);

    /**
     * 开启模板
     *
     * @param customDTO 开启模板参数
     * @return 修改数量
     */
    @ApiOperation(value = "开启模板")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customDTO", dataType = "CustomDTO", value = "开启模板参数", paramType = "body")
    })
    Result<Integer> open(CustomDTO customDTO);

    /**
     * 开启模板 模板可选字段直接使用花名册字段 不需要重复保存
     *
     * @param customDTO 开启模板参数
     * @return 修改数量
     */
    @ApiOperation(value = "开启模板 模板可选字段直接使用花名册字段 不需要重复保存")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customDTO", dataType = "CustomDTO", value = "开启模板参数", paramType = "body")
    })
    Result<Integer> open2(CustomDTO customDTO);

    /**
     * 异步下发模板
     *
     * @param customDTO 下发模板参数
     * @return 下发数量
     */
    @ApiOperation(value = "异步下发模板")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customDTO", dataType = "CustomDTO", value = "下发模板参数", paramType = "body")
    })
    Result<Integer> asyncIssueTemplate(CustomDTO customDTO);

    /**
     * 下发模板
     *
     * @param customDTO 下发模板参数
     * @return 下发数量
     */
    @ApiOperation(value = "下发模板")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customDTO", dataType = "CustomDTO", value = "下发模板参数", paramType = "body")
    })
    Result<Integer> issueTemplate(CustomDTO customDTO);

    /**
     * 下发模板 不区分是否默认 统一下发左侧可选字段与右侧已选字段
     *
     * @param customDTO 下发模板参数
     * @return 下发数量
     */
    @ApiOperation(value = "下发模板 不区分是否默认 统一下发左侧可选字段与右侧已选字段")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "customDTO", dataType = "CustomDTO", value = "下发模板参数", paramType = "body")
    })
    Result<Integer> issueTemplate2(CustomDTO customDTO);

    /**
     * 查询开启的模板
     *
     * @param moduleCode 模块code
     * @param companyId  用工单位id
     * @param siteId     租户id
     * @return 开启的模板
     */
    @ApiOperation(value = "下发模板")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "moduleCode", dataType = "String", value = "模块code", paramType = "query", dataTypeClass = CustomerModuleType.class),
            @ApiImplicitParam(name = "companyId", dataType = "String", value = "用工单位id", paramType = "query"),
            @ApiImplicitParam(name = "siteId", dataType = "String", value = "租户id", paramType = "query")
    })
    Result<CustomTemplateVO> selectOpenTemplate(String moduleCode, String companyId, String siteId);

    /**
     * 查询开启的模板 已选自定义字段在花名册中 取消在可选字段中校验 +
     *
     * @param moduleCode 模块code
     * @param companyId  用工单位id
     * @param siteId     租户id
     * @return 开启的模板
     */
    @ApiOperation(value = "查询开启的模板 已选自定义字段在花名册中 取消在可选字段中校验")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "moduleCode", dataType = "String", value = "模块code", paramType = "query", dataTypeClass = CustomerModuleType.class),
            @ApiImplicitParam(name = "companyId", dataType = "String", value = "用工单位id", paramType = "query"),
            @ApiImplicitParam(name = "siteId", dataType = "String", value = "租户id", paramType = "query")
    })
    Result<CustomTemplateVO> selectOpenTemplate2(String moduleCode, String companyId, String siteId);

    /**
     * 批量确认到岗表单
     *
     * @param moduleCode 模块code
     * @param companyId  用工单位id
     * @param siteId     租户id
     * @return 开启的模板
     */
    @ApiOperation(value = "批量确认到岗表单")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "moduleCode", dataType = "String", value = "模块code", paramType = "query", dataTypeClass = CustomerModuleType.class),
            @ApiImplicitParam(name = "companyId", dataType = "String", value = "用工单位id", paramType = "query"),
            @ApiImplicitParam(name = "siteId", dataType = "String", value = "租户id", paramType = "query")
    })
    Result<CustomTemplateVO> selectOpenTemplate3(String moduleCode, String companyId, String siteId);

    /**
     * 获取预登记自定义字段值
     *
     * @param checkInId 预登记人员id
     * @return 预登记自定义字段值
     */
    @ApiOperation(value = "获取预登记自定义字段值")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "checkInId", dataType = "String", value = "预登记人员id", paramType = "query")
    })
    Result<CustomFieldValueVO> getCheckInField(String checkInId);

    /**
     * 获取入职/待入职自定义字段值
     *
     * @param empId      员工id
     * @param moduleType 模块类型
     * @return 预登记自定义字段值
     */
    @ApiOperation(value = "获取入职/待入职自定义字段值")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empId", dataType = "String", value = "员工id", paramType = "query"),
            @ApiImplicitParam(name = "moduleType", dataType = "String", value = "模块code", paramType = "query")
    })
    Result<CustomFieldValueVO> getEmpField(String empId, String moduleType);

}

